/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package util;

import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.validator.*;

/**
 *
 * @author Rodrigo Scorsatto
 */
public class ValidarCPF implements Validator {

    public ValidarCPF() {
    }

    @Override
    public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
        String cpf = (String) value;

        if (cpf.equals("012.345.678-90")
                || cpf.equals("111.111.111-11")
                || cpf.equals("222.222.222-22")
                || cpf.equals("333.333.333-33")
                || cpf.equals("444.444.444-44")
                || cpf.equals("555.555.555-55")
                || cpf.equals("666.666.666-66")
                || cpf.equals("777.777.777-77")
                || cpf.equals("888.888.888-88")
                || cpf.equals("999.999.999-99")
                || cpf.equals("000.000.000-00")) {
            FacesMessage facesMessage = new FacesMessage(FacesMessage.SEVERITY_ERROR, null, "CPF: Erro de validação: o valor é inválido.");
            throw new ValidatorException(facesMessage);
        } else if (!cpf.substring(0, 1).equals("")) {
            int d1, d2;
            int digito1, digito2, resto;
            int digitoCPF;
            String nDigResult;
            cpf = cpf.replace('.', ' ');
            cpf = cpf.replace('-', ' ');
            cpf = cpf.replaceAll(" ", "");
            d1 = d2 = 0;
            digito1 = digito2 = resto = 0;

            for (int nCount = 1; nCount < cpf.length() - 1; nCount++) {
                digitoCPF = Integer.valueOf(cpf.substring(nCount - 1, nCount)).intValue();

                //multiplique a ultima casa por 2 a seguinte por 3 a seguinte por 4 e assim por diante.  
                d1 = d1 + (11 - nCount) * digitoCPF;

                //para o segundo digito repita o procedimento incluindo o primeiro digito calculado no passo anterior.  
                d2 = d2 + (12 - nCount) * digitoCPF;
            }

            //Primeiro resto da divisão por 11.  
            resto = (d1 % 11);

            //Se o resultado for 0 ou 1 o digito é 0 caso contrário o digito é 11 menos o resultado anterior.  
            if (resto < 2) {
                digito1 = 0;
            } else {
                digito1 = 11 - resto;
            }

            d2 += 2 * digito1;

            //Segundo resto da divisão por 11.  
            resto = (d2 % 11);

            //Se o resultado for 0 ou 1 o digito é 0 caso contrário o digito é 11 menos o resultado anterior.  
            if (resto < 2) {
                digito2 = 0;
            } else {
                digito2 = 11 - resto;
            }

            //Digito verificador do CPF que está sendo validado.  
            String nDigVerific = cpf.substring(cpf.length() - 2, cpf.length());

            //Concatenando o primeiro resto com o segundo.  
            nDigResult = String.valueOf(digito1) + String.valueOf(digito2);

            //comparar o digito verificador do cpf com o primeiro resto + o segundo resto.  
            if (!nDigVerific.equals(nDigResult)) {
                FacesMessage facesMessage = new FacesMessage(FacesMessage.SEVERITY_ERROR, null, "CPF: Erro de validação: o valor é inválido.");
                throw new ValidatorException(facesMessage);
            }
        } else {
            throw new UnsupportedOperationException("Falha ao validar CPF");
        }
    }
}
